package org.snail.proxy.server.netty.serialization;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import org.snail.proxy.proto.NetConstants;
import org.snail.proxy.proto.Packet;

import java.util.List;

/**
 * @author fxd
 * @version 1.0.0
 * @ClassName ProtoDecoder.java
 * @Description TODO
 * @createTime 2021年09月27日 14:05:00
 */
public class ProtoDecoder extends ByteToMessageDecoder {
    private final int limit;

    public ProtoDecoder(int limit){
        this.limit = limit;
    }

    /**
     * @param ctx
     * @param in 请求的数据
     * @param out 将粘在一起的报文拆分后的结果保留起来
     * @throws Exception
     */
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception{
        try {
            // 标记一下当前的readIndex的位置
            in.markReaderIndex();
            // 判断包头长度
            if (in.readableBytes() < NetConstants.PROTOCOL_HEADLENGTH) {
                // 不够包头
//                DLog.LOG_COMMON.error("告警：读到的消息不够包头");
                return;
            }
            byte head = in.readByte();
            // 长度如果小于0
//            if (head != NetConstants.PROTOCOL_HEAD) {
//                // 版本不对，关闭连接
//                //ctx.close();
//            }
            int cmd = in.readInt();
            long sid = in.readLong();
            int length = in.readInt();
            // 长度如果小于0
            if (length < 0) {// 非法数据，关闭连接
                ctx.close();
            }
            if (length > in.readableBytes()) {
                // 读到的消息体长度如果小于传送过来的消息长度
                // 重置读取位置
                in.resetReaderIndex();
//                DLog.LOG_COMMON.error("告警：读到的消息体长度小于传送过来的消息长度");
                return;
            }
            ByteBuf frame = Unpooled.buffer(length);
            in.readBytes(frame);
            byte[] inByte = frame.array();
            out.add(new Packet(head,sid,cmd, inByte));
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
